/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __XOS_STL_PROTOCOL_PACKAGE_PKG_DATA_RET_DATA_RES_H__
#define __XOS_STL_PROTOCOL_PACKAGE_PKG_DATA_RET_DATA_RES_H__

#include <string>
#include "../../import/head.h"
#include "../../tools/head.h"
#include "../db/db_data.h"
#include "pkg_public_functions.h"
#include "pkg_base_res.h"

namespace xos_protocol
{

    template< class CHILD, class T, class PACKER, class SESSION, class DATA, class PACKAGE >
    class pkg_data_ret_data_res : public pkg_base_res<
        pkg_data_ret_data_res< CHILD, T, PACKER, SESSION, DATA, PACKAGE >,
        SESSION,
        DATA,
        PACKAGE >
    {
    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        typedef pkg_data_ret_data_res< CHILD, T, PACKER, SESSION, DATA, PACKAGE > THIS_CHILD;
        typedef pkg_base_res<
            THIS_CHILD,
            SESSION,
            DATA,
            PACKAGE > BASE;

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        pkg_data_ret_data_res( xos_box::i_serial * pSerial, xos_container::i_container * pContainer, int nProtocol ) :
            BASE( pSerial, pContainer, nProtocol )
        {
            data_ptr = 0;
        }
        ~pkg_data_ret_data_res()
        {
            xos_stl::release_interface( data_ptr );
        }

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //
        T * data_ptr;

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //
        int helper_dis_compose( xos_box::i_buf * pBuf )
        {
            int ret = 0;

            ret = f_res_data_dis_compose< THIS_CHILD, T, PACKER >( this, pBuf );

            return ret;
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //
        int helper_proc( int nCookie, SESSION * pSession )
        {
            CHILD * pThis = static_cast<CHILD*>( this );
            return pThis->helper_proc( nCookie, pSession );
        }

        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //
        int helper_compose( int nCookie, xos_box::i_buf * pBuf, bool & bFinished )
        {
            int ret = 0;

            ret = f_res_data_compose< THIS_CHILD, T, PACKER >( this, nCookie, pBuf, bFinished );

            return ret;
        }

        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        int helper_done( DATA * pData )
        {
            CHILD * pThis = static_cast<CHILD*>( this );
            return pThis->helper_done( pData );
        }

    };

} // xos_protocol

#endif // __XOS_STL_PROTOCOL_PACKAGE_PKG_DATA_RET_DATA_RES_H__
